home *** CD-ROM | disk | FTP | other *** search
/ Programming Microsoft Visual Basic .NET / Programming Microsoft Visual Basic .NET (Microsoft Press)(X08-78517)(2002).bin / 21 adonet disconnected / adonetdisconnected / multitableform.vb < prev    next >
Text File  |  2002-03-16  |  9KB  |  193 lines

  1. Imports System.Data
  2. Imports System.Data.OleDb
  3. Imports System.Data.SqlClient
  4.  
  5. Public Class MultiTableForm
  6.     Inherits System.Windows.Forms.Form
  7.  
  8. #Region " Windows Form Designer generated code "
  9.  
  10.     Public Sub New()
  11.         MyBase.New()
  12.  
  13.         'This call is required by the Windows Form Designer.
  14.         InitializeComponent()
  15.  
  16.         'Add any initialization after the InitializeComponent() call
  17.  
  18.     End Sub
  19.  
  20.     'Form overrides dispose to clean up the component list.
  21.     Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
  22.         If disposing Then
  23.             If Not (components Is Nothing) Then
  24.                 components.Dispose()
  25.             End If
  26.         End If
  27.         MyBase.Dispose(disposing)
  28.     End Sub
  29.  
  30.     'Required by the Windows Form Designer
  31.     Private components As System.ComponentModel.IContainer
  32.  
  33.     'NOTE: The following procedure is required by the Windows Form Designer
  34.     'It can be modified using the Windows Form Designer.  
  35.     'Do not modify it using the code editor.
  36.     Friend WithEvents btnTwoTables As System.Windows.Forms.Button
  37.     Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
  38.     Friend WithEvents DataGrid2 As System.Windows.Forms.DataGrid
  39.     <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
  40.         Me.btnTwoTables = New System.Windows.Forms.Button()
  41.         Me.DataGrid1 = New System.Windows.Forms.DataGrid()
  42.         Me.DataGrid2 = New System.Windows.Forms.DataGrid()
  43.         CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
  44.         CType(Me.DataGrid2, System.ComponentModel.ISupportInitialize).BeginInit()
  45.         Me.SuspendLayout()
  46.         '
  47.         'btnTwoTables
  48.         '
  49.         Me.btnTwoTables.Location = New System.Drawing.Point(8, 16)
  50.         Me.btnTwoTables.Name = "btnTwoTables"
  51.         Me.btnTwoTables.Size = New System.Drawing.Size(96, 40)
  52.         Me.btnTwoTables.TabIndex = 0
  53.         Me.btnTwoTables.Text = "Read two Tables"
  54.         '
  55.         'DataGrid1
  56.         '
  57.         Me.DataGrid1.Anchor = ((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
  58.                     Or System.Windows.Forms.AnchorStyles.Right)
  59.         Me.DataGrid1.DataMember = ""
  60.         Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
  61.         Me.DataGrid1.Location = New System.Drawing.Point(120, 16)
  62.         Me.DataGrid1.Name = "DataGrid1"
  63.         Me.DataGrid1.Size = New System.Drawing.Size(504, 136)
  64.         Me.DataGrid1.TabIndex = 1
  65.         '
  66.         'DataGrid2
  67.         '
  68.         Me.DataGrid2.Anchor = (((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
  69.                     Or System.Windows.Forms.AnchorStyles.Left) _
  70.                     Or System.Windows.Forms.AnchorStyles.Right)
  71.         Me.DataGrid2.DataMember = ""
  72.         Me.DataGrid2.HeaderForeColor = System.Drawing.SystemColors.ControlText
  73.         Me.DataGrid2.Location = New System.Drawing.Point(120, 160)
  74.         Me.DataGrid2.Name = "DataGrid2"
  75.         Me.DataGrid2.Size = New System.Drawing.Size(504, 136)
  76.         Me.DataGrid2.TabIndex = 2
  77.         '
  78.         'MultiTableForm
  79.         '
  80.         Me.AutoScaleBaseSize = New System.Drawing.Size(7, 17)
  81.         Me.ClientSize = New System.Drawing.Size(632, 301)
  82.         Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.DataGrid2, Me.DataGrid1, Me.btnTwoTables})
  83.         Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 11.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
  84.         Me.Name = "MultiTableForm"
  85.         Me.Text = "MultiTableForm"
  86.         CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
  87.         CType(Me.DataGrid2, System.ComponentModel.ISupportInitialize).EndInit()
  88.         Me.ResumeLayout(False)
  89.  
  90.     End Sub
  91.  
  92. #End Region
  93.  
  94.     ' ensure that only one constant is -1
  95. #Const OLEDBBIBLIO = 0
  96. #Const OLEDBPUBS = 0
  97. #Const SQLPUBS = -1
  98.  
  99.     Dim ds As New DataSet()
  100.  
  101.     ' smart way to read master-detail tables
  102.  
  103.     Private Sub btnTwoTables_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTwoTables.Click
  104.  
  105.         ' NOTE: to simplify the code and make it as generic as possible, we assume that
  106.         ' the first column in the child table is its foreign key.
  107.  
  108. #If OLEDBBIBLIO Then
  109.         Dim pubSql As String = "SELECT PubId, Name, City FROM Publishers"
  110.         Dim titSql As String = "SELECT PubId, ISBN, Title, [Year Published] FROM Titles"
  111.         Dim joinSql As String = "SELECT Publishers.PubId, Name, City, ISBN, Title, [Year Published] FROM Publishers INNER JOIN Titles ON Publishers.PubId=Titles.PubId WHERE State='MA' AND [Year Published] > 1991 ORDER BY Publishers.PubID"
  112.  
  113.         Dim cn As New OleDbConnection(BiblioConnString)
  114.         Dim pubDa As New OleDbDataAdapter(pubSql, cn)
  115.         Dim titDa As New OleDbDataAdapter(titSql, cn)
  116.         Dim joinDa As New OleDbDataAdapter(joinSql, cn)
  117. #ElseIf OLEDBPUBS Then
  118.         Dim pubSql As String = "SELECT pub_id, pub_name, city FROM Publishers"
  119.         Dim titSql As String = "SELECT pub_id, title_id, title, pubdate FROM Titles"
  120.         Dim joinSql As String = "SELECT Publishers.pub_id, pub_name, city, title_id, title, pubdate FROM Publishers INNER JOIN Titles ON Publishers.pub_id=Titles.pub_id WHERE country='USA' AND pubdate>'10/1/1991' ORDER BY Publishers.pub_id"
  121.  
  122.         Dim cn As New OleDbConnection(OledbPubsConnString)
  123.         Dim pubDa As New OleDbDataAdapter(pubSql, cn)
  124.         Dim titDa As New OleDbDataAdapter(titSql, cn)
  125.         Dim joinDa As New OleDbDataAdapter(joinSql, cn)
  126. #ElseIf SQLPUBS Then
  127.         Dim pubSql As String = "SELECT pub_id, pub_name, city FROM Publishers"
  128.         Dim titSql As String = "SELECT pub_id, title_id, title, pubdate FROM Titles"
  129.         Dim joinSql As String = "SELECT Publishers.pub_id, pub_name, city, title_id, title, pubdate FROM Publishers INNER JOIN Titles ON Publishers.pub_id=Titles.pub_id WHERE country='USA' AND pubdate>'10/1/1991' ORDER BY Publishers.pub_id"
  130.  
  131.         Dim cn As New SqlConnection(SqlPubsConnString)
  132.         Dim pubDa As New SqlDataAdapter(pubSql, cn)
  133.         Dim titDa As New SqlDataAdapter(titSql, cn)
  134.         Dim joinDa As New SqlDataAdapter(joinSql, cn)
  135. #End If
  136.  
  137.         ' Open the connection.
  138.         cn.Open()
  139.  
  140.         ' Create the master and the detail table.
  141.         Dim pubDt As DataTable = ds.Tables.Add("Publishers")
  142.         Dim titDt As DataTable = ds.Tables.Add("Titles")
  143.  
  144.         ' Execute the JOIN operation into on the detail DataTable.
  145.         ' (it will create a table with additional columns from the master table)
  146.         joinDa.Fill(titDt)
  147.  
  148.         ' Fill the schema of the master table.
  149.         pubDa.FillSchema(pubDt, SchemaType.Mapped)
  150.  
  151.         ' This variable holds the last value found in the master table.
  152.         Dim keyValue As String
  153.  
  154.         ' Extract unique foreign key values from child table.
  155.         Dim i As Integer
  156.         Dim dr As DataRow
  157.  
  158.         For Each dr In titDt.Rows
  159.             ' If we haven't seen this key value, create a new record in the master table.
  160.             If dr(0).ToString <> keyValue Then
  161.                 ' Remember the new key value.
  162.                 keyValue = dr(0).ToString
  163.                 ' Add a new record.
  164.                 Dim pubRow As DataRow = pubDt.NewRow
  165.                 ' Copy only the fields that belong to the master table.
  166.                 For i = 0 To pubDt.Columns.Count - 1
  167.                     pubRow(i) = dr(i)
  168.                 Next
  169.                 pubDt.Rows.Add(pubRow)
  170.             End If
  171.         Next
  172.  
  173.         ' removing columns belonging to the master table, but leave the foreign key
  174.         ' (it is the 0-th column)
  175.         For i = pubDt.Columns.Count - 1 To 1 Step -1
  176.             titDt.Columns.RemoveAt(i)
  177.         Next
  178.  
  179.         ' Now we can fill the schema of the child table and close the connectin.
  180.         titDa.FillSchema(titDt, SchemaType.Mapped)
  181.         cn.Close()
  182.  
  183.         ' Add the relation manually.
  184.         ' (Note that this statement is based on the assumption that foreign key is the
  185.         '  first column in the child table)
  186.         ds.Relations.Add("PubTitles", pubDt.Columns(0), titDt.Columns(0))
  187.  
  188.         ' Bind to the DataGrid controls.
  189.         DataGrid1.DataSource = pubDt
  190.         DataGrid2.DataSource = titDt
  191.     End Sub
  192. End Class
  193.